package com.sky.chapter3.unsafe;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author : wushikai
 * <p>
 * date : 2022-07-06
 * SimpleDateFormat中的日期格式不是同步的。推荐（建议）为每个线程创建独立的格式实例。
 * 如果多个线程同时访问一个格式，则它必须保持外部同步。
 *
 *
 * ​ SimpleDateFormat类内部有一个Calendar对象引用,它用来储存和这个SimpleDateFormat相关的日期信息,
 * 例如sdf.parse(dateStr),sdf.format(date) 诸如此类的方法参数传入的日期相关String,Date等等,
 * 都是交由Calendar引用来储存的.这样就会导致一个问题如果你的SimpleDateFormat是个static的,
 * 那么多个thread 之间就会共享这个SimpleDateFormat, 同时也是共享这个Calendar引用。
 *
 */
public class DateUtils1 {

    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 模拟并发环境下使用SimpleDateFormat的 parse方法将字符串转换成 Date对象
     *
     */
    private static Date parseDate(String stringDate) throws Exception {
        return sdf.parse(stringDate);
    }

    public static void main(String[] args) throws Exception {
        for (int i = 1; i <= 30; i++) {
            new Thread(() -> {
                try {
                    System.out.println(DateUtils1.parseDate("2020-11-11 11:11:11"));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, String.valueOf(i)).start();
        }
    }
}
